package com.hy.service;

import com.hy.medicine.MedicineOrder;
import com.hy.medicine.OrderItem;
import com.hy.medicine.dingdan.dto.OrderCreateDTO;

import java.util.List;

/**
 * 订单服务接口
 * 提供订单相关的业务操作方法
 */
public interface OrderService {
    /**
     * 创建订单
     * 根据订单创建DTO创建新的订单，包括订单主体和订单项
     *
     * @param orderCreateDTO 订单创建数据传输对象，包含订单基本信息和商品列表
     * @return 返回创建的订单ID，如果创建失败返回null
     */
    Long createOrder(OrderCreateDTO orderCreateDTO);

    /**
     * 获取订单详情
     * 根据订单ID查询订单信息，包括订单项
     *
     * @param orderId 订单ID
     * @return 返回订单详细信息，如果订单不存在返回null
     */
    MedicineOrder getOrderById(Long orderId);

    /**
     * 获取订单项列表
     * 根据订单ID获取该订单的所有订单项
     *
     * @param orderId 订单ID
     * @return 返回订单项列表
     */
    List<OrderItem> getOrderItems(Long orderId);

    /**
     * 取消订单
     * 取消指定用户的指定订单
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 取消成功返回true，失败返回false
     */
    boolean cancelOrder(Long orderId, Long userId);

    /**
     * 更新订单状态
     * 将订单状态更新为指定状态
     *
     * @param orderId 订单ID
     * @param status 新的订单状态
     * @return 更新成功返回true，失败返回false
     */
    boolean updateOrderStatus(Long orderId, Integer status);

//    /**
//     * 检查订单支付状态
//     * 根据订单ID查询支付状态
//     *
//     * @param orderId 订单ID
//     * @return 返回支付状态字符串
//     * @throws Exception 查询失败时抛出异常
//     */
//    String checkPayStatus(Long orderId) throws Exception;

    /**
     * 获取用户订单列表
     * 获取指定用户的订单列表，可以按状态筛选
     *
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 返回订单列表
     */
    List<MedicineOrder> getOrdersWithItemsByUserId(Long userId, Integer status);

    /**
     * 更新订单的商户订单号
     * 用于支付时更新订单的商户订单号
     *
     * @param orderId 订单ID
     * @param outTradeNo 商户订单号
     * @return 更新成功返回true，失败返回false
     */
    boolean updateOutTradeNo(Long orderId, String outTradeNo);

    /**
     * 根据商户订单号检查支付状态
     * 用于微信支付状态查询
     *
     * @param outTradeNo 商户订单号
     * @return 返回支付状态
     * @throws Exception 查询失败时抛出异常
     */
    String checkPayStatus(String outTradeNo) throws Exception;
}
